﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comissoes.Models;
using Comissoes.JQGridObject;
using Comissoes.Utilities;

namespace Comissoes.Controllers
{
    public class ListasController : AppController
    {
        xcontEntities db = new xcontEntities();

        // Monta a lista de tipos de produtos
        public ActionResult Index()
        {
            return View();
        }

        // Monta a lista de tipos de produtos
        public JsonResult List(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchString, String searchOper)
        {
            try
            {
                var q = from c in db.LISTAS
                        select new
                        {
                            c.COD_LISTA,
                            c.DESC_LISTA,
                            c.VALIDADE_INICIO_LISTA,
                            c.VALIDADE_TERMINO_LISTA
                        };

                JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "COD_LISTA", _search, rows);

                return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult Details(int id)
        {
            return View(db.LISTAS.FirstOrDefault(t => t.COD_LISTA == id));
        }

        public ActionResult Edit(int? id)
        {
            ListasModel lista = new ListasModel(id);

            return View(lista);
        }

        [HttpPost]
        public ActionResult Edit(Int32? id, FormCollection form)
        {
            ListasModel lista = new ListasModel(id);

            if (lista.UpdateValidate(form).Any())
                return Json(lista.UpdateValidate(form), JsonRequestBehavior.AllowGet);

            else
                lista.Update(form);

            return Json(lista.lista.COD_LISTA, JsonRequestBehavior.AllowGet);
        }

        public JsonResult Delete(int id)
        {
            List<string> erros = new List<string>();
            try
            {
                db.DeleteObject(db.LISTAS.FirstOrDefault(t => t.COD_LISTA == id));
                db.SaveChanges();

                return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
                if (ex.InnerException != null)
                    erros.Add(ex.InnerException.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        // Monta a lista de tipos de produtos
        public JsonResult ProdutosList(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchString, String searchOper, Int32 COD_LISTA)
        {
            try
            {
                var q = from c in db.PRODUTOS_LISTA
                        where c.LISTAS.COD_LISTA == COD_LISTA
                        select new
                        {
                            act = "",
                            c.ID_PDLS,
                            c.PRODUTOS.COD_PROD,
                            c.PRODUTOS.DESC_PROD,
                            c.CUSTO_PDLS,
                            c.MARGEM_PDLS,
                            c.PRECO_PDLS
                        };

                Dictionary<string, string> formats = new Dictionary<string, string>
                {
                    { "CUSTO_PDLS", "A" },
                    { "PRECO_PDLS", "A" }
                };

                JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "ID_PDLS", _search, rows, formats);

                return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult ProdutoEdit(Int32? id)
        {
            if (id.HasValue)
            {
                return PartialView(db.PRODUTOS_LISTA.Include("PRODUTOS").FirstOrDefault(t => t.ID_PDLS == id));
            }
            else
            {
                return PartialView(new PRODUTOS_LISTA());
            }
        }

        [HttpPost]
        public ActionResult ProdutoEdit(Int32 COD_LISTA, Int32 COD_PROD, FormCollection form)
        {
            List<string> erros = new List<string>();

            try
            {
                PRODUTOS_LISTA produto;
                if (!db.PRODUTOS_LISTA.Any(t => t.LISTAS.COD_LISTA == COD_LISTA && t.PRODUTOS.COD_PROD == COD_PROD))
                {
                    produto = new PRODUTOS_LISTA();
                    db.AddToPRODUTOS_LISTA(produto);
                }
                else
                {
                    produto = db.PRODUTOS_LISTA.FirstOrDefault(t => t.LISTAS.COD_LISTA == COD_LISTA && t.PRODUTOS.COD_PROD == COD_PROD);
                }

                produto.LISTAS = db.LISTAS.FirstOrDefault(t => t.COD_LISTA == COD_LISTA);
                produto.PRODUTOS = db.PRODUTOS.FirstOrDefault(t => t.COD_PROD == COD_PROD);
                produto.CUSTO_PDLS = Convertions.Decimal(form["CUSTO_PDLS"]);
                produto.MARGEM_PDLS = Convertions.Decimal(form["MARGEM_PDLS"]);
                produto.PRECO_PDLS = Convertions.Decimal(form["PRECO_PDLS"]);

                db.SaveChanges();

                return Json(new { result = true }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
                if (ex.InnerException != null)
                    erros.Add(ex.InnerException.Message);
            }

            return Json(new { result = false, erros = erros }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult ProdutoDelete(Int32 id)
        {
            List<string> erros = new List<string>();
            try
            {
                db.DeleteObject(db.PRODUTOS_LISTA.FirstOrDefault(t => t.ID_PDLS == id));
                db.SaveChanges();

                return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
                if (ex.InnerException != null)
                    erros.Add(ex.InnerException.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }
    }
}
